package com.hjx.leetcode;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 349. 两个数组的交集
 * 给定两个数组，编写一个函数来计算它们的交集。
 *
 *  
 *
 * 示例 1：
 *
 *      输入：nums1 = [1,2,2,1], nums2 = [2,2]
 *      输出：[2]
 * 示例 2：
 *
 *      输入：nums1 = [4,9,5], nums2 = [9,4,9,8,4]
 *      输出：[9,4]
 *  
 *
 * 说明：
 *
 *      输出结果中的每个元素一定是唯一的。
 *      我们可以不考虑输出结果的顺序。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/intersection-of-two-arrays
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
class LeetCode_349 {

    public int[] intersection1(int[] nums1, int[] nums2) {
        Set<Integer> s1 = new HashSet<>();
        Set<Integer> s2 = new HashSet<>();
        for (int i : nums1) {
            s1.add(i);
        }
        for (int j : nums2) {
            s2.add(j);
        }
        s1.retainAll(s2);
        Integer[] integers = s1.toArray(new Integer[s2.size()]);
        int[] intersection = new int[s1.size()];
        for (int i = 0; i < s1.size(); i++) {
            intersection[i] = integers[i];
        }

        return intersection;
    }

    public int[] intersection2(int[] nums1, int[] nums2) {

        Map<Integer, Integer> maps = new HashMap<>();
        for (int i = 0; i < nums1.length; i++) {
            if (maps.get(nums1[i]) == null) {
                maps.put(nums1[i], 1);
            } else {
                maps.put(nums1[i], maps.get(nums1[i]) + 1);
            }
        }
        List<Integer> intersection = new ArrayList<>();
        maps.keySet().forEach(key -> {
            int times = 0;
            int index = -1;
            for (int i = 0; i < nums2.length; i++) {
                if (key == nums2[i]) {
                    times++;
                    index=i;
                }
            }
            if (times > 0) {
                intersection.add(nums2[index]);
            }
        });

        Integer[] integers = intersection.toArray(new Integer[intersection.size()]);
        int[] returnvalue = new int[integers.length];
        for (int i = 0; i < integers.length; i++) {
            returnvalue[i] = integers[i];
        }
        return returnvalue;
    }
}
